package cgin

import (
	"regexp"
	"strings"
	"unicode/utf8"
)

// Validator 验证器接口
type Validator interface {
	Validate() error
}

// ValidationErrors 验证错误集合
type ValidationErrors map[string]string

func (v ValidationErrors) Error() string {
	var errors []string
	for field, err := range v {
		errors = append(errors, field+": "+err)
	}
	return strings.Join(errors, "; ")
}

// 常用验证规则
var (
	emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
	phoneRegex = regexp.MustCompile(`^1[3-9]\d{9}$`)
)

// ValidateStruct 验证结构体
func ValidateStruct(obj interface{}) error {
	// 如果对象实现了 Validator 接口，使用自定义验证
	if validator, ok := obj.(Validator); ok {
		return validator.Validate()
	}

	// 这里可以添加基于标签的自动验证
	// 比如使用 struct tags: `validate:"required,email"`
	// 由于时间关系，这里只实现接口验证

	return nil
}

// 常用验证函数
func Required(value string) bool {
	return strings.TrimSpace(value) != ""
}

func MinLength(value string, min int) bool {
	return utf8.RuneCountInString(value) >= min
}

func MaxLength(value string, max int) bool {
	return utf8.RuneCountInString(value) <= max
}

func IsEmail(value string) bool {
	return emailRegex.MatchString(value)
}

func IsPhone(value string) bool {
	return phoneRegex.MatchString(value)
}
